package com.examlpe.cels.dao.impl;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

import com.examlpe.cels.dao.IBaseTermDao;
import com.examlpe.cels.entity.Vocabulary;
import com.examlpe.cels.entity.Word;
import com.examlpe.cels.exception.FileNotFoundException;
import com.examlpe.cels.service.IGameService;

public class BaseTermDaoImpl implements IBaseTermDao {

	//@Override
	public Set<Word> getAllWords() throws FileNotFoundException {
		// 创建一个TreeSet集合
		Set<Word> words = new TreeSet<Word>();
		// 判断原始的单词数据文件是否存在
		File file = new File(IBaseTermDao.WORD_FILE);
		if(!file.exists()) {
			throw new FileNotFoundException("单词文件数据不存在");
		}
		// 利用IO流中的字符流来循环读到数据
		BufferedReader br = null;
		try {
			br  = new BufferedReader(new FileReader(file));
			// 依次处理读到的每一行数据，每一行对应一个Word对象
			String len = null; 
			while((len = br.readLine()) != null) {
				// 获取的len通过空格切割成String类型数组，下标为0表示英文
				String en = len.split(" ")[0];
				// 这里的en的内容为abbreviated，实际上我们需要Abbreviated
				/**
				 *  en.toUpperCase()	表示把英文部分全大写
				 *  	ABBREVIATED
				 *  en.toUpperCase().subString(0, 1)			[0,1)
				 *  	A
				 *  en.subString(1)	从下标1开始到最后结束
				 *  	bbreviated
				 */
				en = en.toUpperCase().substring(0, 1).concat(en.substring(1)); // Abbreviated
				// 下标为1表示的中文
				String cn = len.split(" ")[1];
				// 获取了中文和英文之后，打包实例化对象Word对象
				Word w = new Word(en, cn);
				// 设置当前w对象的first属性
				w.setFirst(en.charAt(0));
				// 把创建好的Word对象添加到Set集合中
				words.add(w);
			}
		} catch (IOException e) {
			// 显示当前所捕捉的是什么异常 —— 打印出当前是什么错/什么问题
			// 导致不能够创建字符输入流
			System.out.println(e.getMessage());
		} finally {
			// finally 无论执行try还是catch都会执行该内容，用完关闭输入流
			if(br != null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 返回集合Set
		return words;
	}
	// 获取所有的词汇
	//@Override
	public Set<Vocabulary> getAllVocabularies() throws FileNotFoundException {
		// 创建一个Set集合，为了存储所有的词汇
		Set<Vocabulary> set = new TreeSet<Vocabulary>();
		// 判断原始的词汇数据文件是否存在
		File file = new File(IBaseTermDao.VOCABULARY_FILE);
		if(!file.exists()) {
			throw new FileNotFoundException("词汇文件数据不存在");
		}
		// 利用IO流的字符流来循环读到数据
		BufferedReader br = null;
		try {
			br = new BufferedReader(new FileReader(file));
			// 依次处理读到的每一行数据，每一行对应的一个Vocabulary对象
			String len = null;
			while((len = br.readLine()) != null) {
				// 获取英文
				String en = len.split("#")[0];
				// 获取中文
				String cn = len.split("#")[1];
				// 实例化对象
				Vocabulary v = null;
				// 判断被分割之后的字符串数组长度等于3，表示有缩写
				if(len.split("#").length == 3) {
					// 表示有缩写的Vocabulary对象
					v = new Vocabulary(en, cn, len.split("#")[2]);
				} else {
					// 没有缩写的对象
					v = new Vocabulary(en, cn, null);
				}
				// 把创建好的Vocabulary对象添加到集合中
				set.add(v);
			}
		// 处理IO异常
		} catch (IOException e) {
			System.out.println(e.getMessage());
		} finally {
			if(br!=null) {
				try {
					br.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
 		// 返回
		return set;
	}
	/**
	 *  把Map中的数据写在fileName的文件中
	 * @throws FileNotFoundException 
	 */
	//@Override
	public void writeToFile(Map<String, String> map, String fileName) throws FileNotFoundException {
		// 1. 创建File对象
		File file = new File(fileName);
				// 2. 判断此File是否是文件
				if(!file.isFile()) {
					throw new FileNotFoundException("不是file文件");
				}
				// 3. 利用对象流完成写入
				ObjectOutputStream oos  = null;
				try {
					oos = new ObjectOutputStream(new FileOutputStream(file));
					oos.writeObject(map);
				} catch (IOException e) {
					System.out.println("对象输出流生成失败");
				}finally{
					if(oos!=null) {
						try {
							oos.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
				// 4. 处理异常
		
	}
	/**
	 *  从fileName文件中把数据读出来，存放在Map集合中
	 * @throws FileNotFoundException 
	 */
	//@Override
	public Map<String, String> readFromFile(String fileName) throws FileNotFoundException {
		// 判断fileName是否存在
		File file = new File(fileName);
		if(!file.exists()) {
			throw new FileNotFoundException("文件不存在");
		}
				// 调用readObject方法直接读取出来对象，并转换成Map集合
		Map<String, String> map  = null;
		ObjectInputStream ois = null;
				try {
					ois = new ObjectInputStream(new FileInputStream(file));
					map = (Map<String, String>) ois.readObject();
				} catch (IOException e) {
					System.out.println("对象输入流生成失败");
				} catch (ClassNotFoundException e) {
					System.out.println("数据读取失败");
				}finally{
					if(ois!=null) {
						try {
							ois.close();
						} catch (IOException e) {
							e.printStackTrace();
						}
					}
				}
				// 返回
		return map;
	}

}
